/*
后台运行线程
分离线程在后台运行，
一般分离线程为守护线程
*/
#include <thread>
#include <string>
#include <iostream>

void open_document_and_display_gui(std::string const& filename)
{
    std::cout << "open_document_and_display_gui " << filename << std::endl;
}

bool done_editing()
{
    return false;
}

enum command_type{
    open_new_document,
    close_new_document
};


struct user_command
{
    command_type type;

    user_command():
        type(open_new_document)
    {}
};

user_command get_user_input()
{
    return user_command();
}

std::string get_filename_from_user()
{
    return "foo.doc";
}

void process_user_input(user_command & cmd)
{
    std::cout << "process_user_input : " << std::endl;
    std::string input;
    std::cin >> input ;
    std::cout << "input : " << input << std::endl;
    if(input.compare("123")){
        cmd.type = close_new_document;
    }
}

void edit_document(std::string const& filename)
{
    open_document_and_display_gui(filename);
    while(!done_editing())
    {
        user_command cmd=get_user_input();
        if(cmd.type==open_new_document)
        {
            std::string const new_name=get_filename_from_user();
            std::thread t(edit_document,new_name);  // 可以向 thread 构造传递参数，
            t.detach();  // 线程到后台运行，意味着主线程不能与之产生直接交互 ； 分离线程不能被加入 join；但是资源还是能被正常回收的
        }
        else
        {
            process_user_input(cmd);
        }
    }
}

int main()
{
    edit_document("bar.doc");
    edit_document("bar1.doc");
}
